/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package controladores;

import controladores.exceptions.IllegalOrphanException;
import controladores.exceptions.NonexistentEntityException;
import controladores.exceptions.PreexistingEntityException;
import entidades.Actividades;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import entidades.Actividadesacademicas;
import entidades.Tipoactividades;
import entidades.Persona;
import entidades.Lugar;
import entidades.Evento;
import entidades.Comite;
import entidades.Items;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Andres
 */
public class ActividadesJpaController {

    public ActividadesJpaController() {
        emf = Persistence.createEntityManagerFactory("proyectoCongresoPU");
    }
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void consultaPersonalizada (String consulta){
       EntityManager em = null;
        em = getEntityManager();
        em.getTransaction().begin(); // esta idnica el inciio de la transaccion
        
        // si ocurre error en algun lado de la transaccion se hace un rollback es una validacion de buenas prácticas en bases de datos.
        em.createNativeQuery(consulta);//ahí se haria la consulta sql? ajam
        // ejemplo de lo que vendría en el String consulta es : select * from pais p;
        
        em.getTransaction().commit();// esta el final 
    }

    public void create(Actividades actividades) throws PreexistingEntityException, Exception {
        if (actividades.getItemsList() == null) {
            actividades.setItemsList(new ArrayList<Items>());
        }
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Actividadesacademicas actividadesacademicas = actividades.getActividadesacademicas();
            if (actividadesacademicas != null) {
                actividadesacademicas = em.getReference(actividadesacademicas.getClass(), actividadesacademicas.getActividadesCodigo());
                actividades.setActividadesacademicas(actividadesacademicas);
            }
            Tipoactividades tipoactividades = actividades.getTipoactividades();
            if (tipoactividades != null) {
                tipoactividades = em.getReference(tipoactividades.getClass(), tipoactividades.getCodigo());
                actividades.setTipoactividades(tipoactividades);
            }
            Persona persona = actividades.getPersona();
            if (persona != null) {
                persona = em.getReference(persona.getClass(), persona.getCodigopersona());
                actividades.setPersona(persona);
            }
            Lugar lugar = actividades.getLugar();
            if (lugar != null) {
                lugar = em.getReference(lugar.getClass(), lugar.getRecursosIdrecurso());
                actividades.setLugar(lugar);
            }
            Evento evento = actividades.getEvento();
            if (evento != null) {
                evento = em.getReference(evento.getClass(), evento.getCodigo());
                actividades.setEvento(evento);
            }
            Comite comite = actividades.getComite();
            if (comite != null) {
                comite = em.getReference(comite.getClass(), comite.getCodigocomite());
                actividades.setComite(comite);
            }
            List<Items> attachedItemsList = new ArrayList<Items>();
            for (Items itemsListItemsToAttach : actividades.getItemsList()) {
                itemsListItemsToAttach = em.getReference(itemsListItemsToAttach.getClass(), itemsListItemsToAttach.getIditem());
                attachedItemsList.add(itemsListItemsToAttach);
            }
            actividades.setItemsList(attachedItemsList);
            em.persist(actividades);
            if (actividadesacademicas != null) {
                Actividades oldActividadesOfActividadesacademicas = actividadesacademicas.getActividades();
                if (oldActividadesOfActividadesacademicas != null) {
                    oldActividadesOfActividadesacademicas.setActividadesacademicas(null);
                    oldActividadesOfActividadesacademicas = em.merge(oldActividadesOfActividadesacademicas);
                }
                actividadesacademicas.setActividades(actividades);
                actividadesacademicas = em.merge(actividadesacademicas);
            }
            if (tipoactividades != null) {
                tipoactividades.getActividadesList().add(actividades);
                tipoactividades = em.merge(tipoactividades);
            }
            if (persona != null) {
                persona.getActividadesList().add(actividades);
                persona = em.merge(persona);
            }
            if (lugar != null) {
                lugar.getActividadesList().add(actividades);
                lugar = em.merge(lugar);
            }
            if (evento != null) {
                evento.getActividadesList().add(actividades);
                evento = em.merge(evento);
            }
            if (comite != null) {
                comite.getActividadesList().add(actividades);
                comite = em.merge(comite);
            }
            for (Items itemsListItems : actividades.getItemsList()) {
                Actividades oldActividadesOfItemsListItems = itemsListItems.getActividades();
                itemsListItems.setActividades(actividades);
                itemsListItems = em.merge(itemsListItems);
                if (oldActividadesOfItemsListItems != null) {
                    oldActividadesOfItemsListItems.getItemsList().remove(itemsListItems);
                    oldActividadesOfItemsListItems = em.merge(oldActividadesOfItemsListItems);
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            if (findActividades(actividades.getCodigo()) != null) {
                throw new PreexistingEntityException("Actividades " + actividades + " already exists.", ex);
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(Actividades actividades) throws IllegalOrphanException, NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Actividades persistentActividades = em.find(Actividades.class, actividades.getCodigo());
            Actividadesacademicas actividadesacademicasOld = persistentActividades.getActividadesacademicas();
            Actividadesacademicas actividadesacademicasNew = actividades.getActividadesacademicas();
            Tipoactividades tipoactividadesOld = persistentActividades.getTipoactividades();
            Tipoactividades tipoactividadesNew = actividades.getTipoactividades();
            Persona personaOld = persistentActividades.getPersona();
            Persona personaNew = actividades.getPersona();
            Lugar lugarOld = persistentActividades.getLugar();
            Lugar lugarNew = actividades.getLugar();
            Evento eventoOld = persistentActividades.getEvento();
            Evento eventoNew = actividades.getEvento();
            Comite comiteOld = persistentActividades.getComite();
            Comite comiteNew = actividades.getComite();
            List<Items> itemsListOld = persistentActividades.getItemsList();
            List<Items> itemsListNew = actividades.getItemsList();
            List<String> illegalOrphanMessages = null;
            if (actividadesacademicasOld != null && !actividadesacademicasOld.equals(actividadesacademicasNew)) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("You must retain Actividadesacademicas " + actividadesacademicasOld + " since its actividades field is not nullable.");
            }
            for (Items itemsListOldItems : itemsListOld) {
                if (!itemsListNew.contains(itemsListOldItems)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain Items " + itemsListOldItems + " since its actividades field is not nullable.");
                }
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            if (actividadesacademicasNew != null) {
                actividadesacademicasNew = em.getReference(actividadesacademicasNew.getClass(), actividadesacademicasNew.getActividadesCodigo());
                actividades.setActividadesacademicas(actividadesacademicasNew);
            }
            if (tipoactividadesNew != null) {
                tipoactividadesNew = em.getReference(tipoactividadesNew.getClass(), tipoactividadesNew.getCodigo());
                actividades.setTipoactividades(tipoactividadesNew);
            }
            if (personaNew != null) {
                personaNew = em.getReference(personaNew.getClass(), personaNew.getCodigopersona());
                actividades.setPersona(personaNew);
            }
            if (lugarNew != null) {
                lugarNew = em.getReference(lugarNew.getClass(), lugarNew.getRecursosIdrecurso());
                actividades.setLugar(lugarNew);
            }
            if (eventoNew != null) {
                eventoNew = em.getReference(eventoNew.getClass(), eventoNew.getCodigo());
                actividades.setEvento(eventoNew);
            }
            if (comiteNew != null) {
                comiteNew = em.getReference(comiteNew.getClass(), comiteNew.getCodigocomite());
                actividades.setComite(comiteNew);
            }
            List<Items> attachedItemsListNew = new ArrayList<Items>();
            for (Items itemsListNewItemsToAttach : itemsListNew) {
                itemsListNewItemsToAttach = em.getReference(itemsListNewItemsToAttach.getClass(), itemsListNewItemsToAttach.getIditem());
                attachedItemsListNew.add(itemsListNewItemsToAttach);
            }
            itemsListNew = attachedItemsListNew;
            actividades.setItemsList(itemsListNew);
            actividades = em.merge(actividades);
            if (actividadesacademicasNew != null && !actividadesacademicasNew.equals(actividadesacademicasOld)) {
                Actividades oldActividadesOfActividadesacademicas = actividadesacademicasNew.getActividades();
                if (oldActividadesOfActividadesacademicas != null) {
                    oldActividadesOfActividadesacademicas.setActividadesacademicas(null);
                    oldActividadesOfActividadesacademicas = em.merge(oldActividadesOfActividadesacademicas);
                }
                actividadesacademicasNew.setActividades(actividades);
                actividadesacademicasNew = em.merge(actividadesacademicasNew);
            }
            if (tipoactividadesOld != null && !tipoactividadesOld.equals(tipoactividadesNew)) {
                tipoactividadesOld.getActividadesList().remove(actividades);
                tipoactividadesOld = em.merge(tipoactividadesOld);
            }
            if (tipoactividadesNew != null && !tipoactividadesNew.equals(tipoactividadesOld)) {
                tipoactividadesNew.getActividadesList().add(actividades);
                tipoactividadesNew = em.merge(tipoactividadesNew);
            }
            if (personaOld != null && !personaOld.equals(personaNew)) {
                personaOld.getActividadesList().remove(actividades);
                personaOld = em.merge(personaOld);
            }
            if (personaNew != null && !personaNew.equals(personaOld)) {
                personaNew.getActividadesList().add(actividades);
                personaNew = em.merge(personaNew);
            }
            if (lugarOld != null && !lugarOld.equals(lugarNew)) {
                lugarOld.getActividadesList().remove(actividades);
                lugarOld = em.merge(lugarOld);
            }
            if (lugarNew != null && !lugarNew.equals(lugarOld)) {
                lugarNew.getActividadesList().add(actividades);
                lugarNew = em.merge(lugarNew);
            }
            if (eventoOld != null && !eventoOld.equals(eventoNew)) {
                eventoOld.getActividadesList().remove(actividades);
                eventoOld = em.merge(eventoOld);
            }
            if (eventoNew != null && !eventoNew.equals(eventoOld)) {
                eventoNew.getActividadesList().add(actividades);
                eventoNew = em.merge(eventoNew);
            }
            if (comiteOld != null && !comiteOld.equals(comiteNew)) {
                comiteOld.getActividadesList().remove(actividades);
                comiteOld = em.merge(comiteOld);
            }
            if (comiteNew != null && !comiteNew.equals(comiteOld)) {
                comiteNew.getActividadesList().add(actividades);
                comiteNew = em.merge(comiteNew);
            }
            for (Items itemsListNewItems : itemsListNew) {
                if (!itemsListOld.contains(itemsListNewItems)) {
                    Actividades oldActividadesOfItemsListNewItems = itemsListNewItems.getActividades();
                    itemsListNewItems.setActividades(actividades);
                    itemsListNewItems = em.merge(itemsListNewItems);
                    if (oldActividadesOfItemsListNewItems != null && !oldActividadesOfItemsListNewItems.equals(actividades)) {
                        oldActividadesOfItemsListNewItems.getItemsList().remove(itemsListNewItems);
                        oldActividadesOfItemsListNewItems = em.merge(oldActividadesOfItemsListNewItems);
                    }
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                Integer id = actividades.getCodigo();
                if (findActividades(id) == null) {
                    throw new NonexistentEntityException("The actividades with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(Integer id) throws IllegalOrphanException, NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Actividades actividades;
            try {
                actividades = em.getReference(Actividades.class, id);
                actividades.getCodigo();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The actividades with id " + id + " no longer exists.", enfe);
            }
            List<String> illegalOrphanMessages = null;
            Actividadesacademicas actividadesacademicasOrphanCheck = actividades.getActividadesacademicas();
            if (actividadesacademicasOrphanCheck != null) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Actividades (" + actividades + ") cannot be destroyed since the Actividadesacademicas " + actividadesacademicasOrphanCheck + " in its actividadesacademicas field has a non-nullable actividades field.");
            }
            List<Items> itemsListOrphanCheck = actividades.getItemsList();
            for (Items itemsListOrphanCheckItems : itemsListOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Actividades (" + actividades + ") cannot be destroyed since the Items " + itemsListOrphanCheckItems + " in its itemsList field has a non-nullable actividades field.");
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            Tipoactividades tipoactividades = actividades.getTipoactividades();
            if (tipoactividades != null) {
                tipoactividades.getActividadesList().remove(actividades);
                tipoactividades = em.merge(tipoactividades);
            }
            Persona persona = actividades.getPersona();
            if (persona != null) {
                persona.getActividadesList().remove(actividades);
                persona = em.merge(persona);
            }
            Lugar lugar = actividades.getLugar();
            if (lugar != null) {
                lugar.getActividadesList().remove(actividades);
                lugar = em.merge(lugar);
            }
            Evento evento = actividades.getEvento();
            if (evento != null) {
                evento.getActividadesList().remove(actividades);
                evento = em.merge(evento);
            }
            Comite comite = actividades.getComite();
            if (comite != null) {
                comite.getActividadesList().remove(actividades);
                comite = em.merge(comite);
            }
            em.remove(actividades);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<Actividades> findActividadesEntities() {
        return findActividadesEntities(true, -1, -1);
    }

    public List<Actividades> findActividadesEntities(int maxResults, int firstResult) {
        return findActividadesEntities(false, maxResults, firstResult);
    }

    private List<Actividades> findActividadesEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            cq.select(cq.from(Actividades.class));
            Query q = em.createQuery(cq);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public Actividades findActividades(Integer id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(Actividades.class, id);
        } finally {
            em.close();
        }
    }

    public int getActividadesCount() {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            Root<Actividades> rt = cq.from(Actividades.class);
            cq.select(em.getCriteriaBuilder().count(rt));
            Query q = em.createQuery(cq);
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }

}
